/*
 * Copyright (C) 2011 Young, Fey <fey.young@gmail.com>
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 * 
 */

package com.youngfey.util
import scala.actors._

/**
 * @author Young, Fey <fey.young@gmail.com>
 */
protected class Engine(val hydra: Hydra, val timeout: Int) extends Actor {
  var busy = false
  
  def handle(msg: HydraMessage) {
    if(busy) hydra ! msg else {
      busy = true
      try hydra ! hydra.run(msg) catch {
        case ex: Exception => hydra ! HydraFailure(msg, ex) 
      }
      busy = false
    }
  }

  def act() {
    while(!hydra.idle) {
      receiveWithin(timeout) {
        case msg: HydraMessage => handle(msg)
        case _ =>
      }
    }
  }
}

trait HydraMessage
trait HydraOutput
case class HydraFailure(val msg: HydraMessage, val ex: Exception)

trait HydraObserver {
  def update(output: HydraOutput): Unit 
  def recover(failure: HydraFailure): Unit
}
